package com.pronosticnews.server.services;

import java.util.Collection;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.pronosticnews.client.services.PartieService;
import com.pronosticnews.server.domain.dao.ParticipationDao;
import com.pronosticnews.server.domain.dao.PartieDao;
import com.pronosticnews.server.domain.model.Partie;
import com.pronosticnews.shared.model.PartieDto;

import fr.ysa.persistence.DaoException;
import fr.ysa.persistence.IDao;
import fr.ysa.persistence.requetes.ConfigRequetes;
import fr.ysa.persistence.requetes.filtres.Filtre;
import fr.ysa.persistence.requetes.filtres.Filtre.TYPE;
import fr.ysa.persistence.requetes.filtres.ValueFiltre;
import fr.ysa.persistence.requetes.filtres.ValueFiltre.OPERATION;
import fr.ysa.services.ImplService;
import fr.ysa.services.ServiceException;

@Service("partieService")
@Transactional
public class PartieServiceImpl extends ImplService<Partie, PartieDto> implements
		PartieService {

	@Autowired
	PartieDao partieDao;

	@Autowired
	ParticipationDao participationDao;

	@Autowired
	Mapper mapper;

	@Override
	public IDao<Partie> getDao() {
		return partieDao;
	}

	@Override
	public Class<Partie> getEntityClass() {
		return Partie.class;
	}

	@Override
	public Class<PartieDto> getEntityDtoClass() {
		return PartieDto.class;
	}

	@Override
	public Collection<PartieDto> sauvegarder(Collection<PartieDto> entities)
			throws ServiceException {
		for (PartieDto partieDto : entities) {
			sauvegarder(partieDto);
		}
		return entities;
	}

	@Override
	public PartieDto sauvegarder(PartieDto partieDto) throws ServiceException {
		if (partieDto.getId() != null) {
			ConfigRequetes req = new ConfigRequetes();
			Filtre filtreId = new Filtre();
			filtreId.setName(Partie.VALUE_NAME.id.name());
			filtreId.setType(TYPE.NUMBER);
			ValueFiltre valueId = new ValueFiltre();
			valueId.setOperation(OPERATION.EQUAL);
			valueId.setValue(partieDto.getId().toString());
			filtreId.getValues().add(valueId);
			req.getFiltres().add(filtreId);
			try {
				Partie partieAvantModif = partieDao.trouver(req).get(0);
				participationDao.majClassement(partieAvantModif,
						mapper.map(partieDto, Partie.class));
			} catch (DaoException e) {
				throw new ServiceException(e.getMessage());
			}

			super.modifier(partieDto);
		} else {
			participationDao.majClassement(mapper.map(partieDto, Partie.class));
			super.sauvegarder(partieDto);
		}
		return partieDto;
	}

}
